#include<memory.h>
#include<stdio.h>
struct gdt_descr *gdt;

void add_gdt(unsigned short limite,unsigned long int base,unsigned char att0_7,unsigned char att8_15) {
	int i;
	for(i=0;i<GDT_USE;i++) {
		gdt[i].limite = limite;
		gdt[i].base0_15 = base & 0xFFFF;
		gdt[i].base16_23 = (base >> 16) & 0xFF;
		gdt[i].base24_31 = (base >> 24) & 0xFF;
		gdt[i].attributi0_7 = att0_7;
		gdt[i].attributi8_15 = att8_15;
	}
}

void load_gdt(struct gdt_descr *base) {
	unsigned lgdt[2];
	lgdt[0]=(MAX_GDT*8-1)<<16;
	lgdt[1]=(unsigned int)base;
	//asm("": : :"memory");
	//__asm__ __volatile__ ("lgdt (%0)": :"g" ((char *)lgdt+2)); //<----- si ravvia..
	/* NOTE PERSONALI:
		possibilmente si ravvia perkè c'è impostata la vekkia gdt...
		forse è meglio impostare la gdt direttamente dal boot.
	// Nota: 14/02/2007 --> Sembra tutt funzionare... c'è da riguardare la funziona MALLOC
		Ho notato la funzione malloc produce un ravvio..
	/*
		02/04/07
		Debug della GDT. Devo vedere se veramente funziona. Devo poggiare delle basi solide per il multi
		tasking. Nulla a riguardo la funzione MALLOC.
	*/
	// <-- inserire il codice per caricare la TSS nel registro TR
}

void init_gdt() {
	int i;
	long flags;
	save_eflag(flags);
	//printk("SALVO IL FLAG\n");
	//asm("cli");
	gdt = (void*)0x2000;//(struct gdt_descr*)malloc(GDT_USE*GDT_DIM);
	//printk("ALLOCO MEMORIA\n");
	add_gdt(0,0,0,0); // <-- descrittore di default
	// supervisore
	add_gdt(0,0xFFFFF,KERNEL_CODE_SEGMENT,DEFAULT_FLAGS);
	add_gdt(0,0xFFFFF,KERNEL_DATA_SEGMENT,DEFAULT_FLAGS);
	
	// user
	add_gdt(0,0xFFFFF,USER_CODE_SEGMENT,DEFAULT_FLAGS);
	add_gdt(0,0xFFFFF,USER_DATA_SEGMENT,DEFAULT_FLAGS);	

	load_gdt(gdt);
	restore_eflag(flags);


	//asm("sti");

	/* NOTA: 14/02/2007 --> CLI e STI ravviano il computer. forse non c'è bisogno al main
		viene fatto prima */
}
